package customerEnter.Frame.Utils;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import customerEnter.tool.WhetherToEmpty;

/**
 * 實現 java 類的反射
 * 
 * 类名称：ParadigmBeanUtils 类描述： 创建人：dy 创建时间：2017-1-13 下午3:09:25
 * 
 */
public class BeanParadigmUtils {

	private static BeanParadigmUtils	beanParadigmUtils;

	private static Class<?>				class1;

	private static Field[]				fields;

	private static Map<String, Object>	map;

	private static Map<String, Integer>	mapOrder;

	private static Object				object1;

	/**
	 * 初始化 類型
	 */
	public static void initialBean(Class<?> classNew) {
		class1 = classNew;
	}

	/**
	 * 初始化 類型和實體
	 */
	public static void initialBean(Object object) {
		class1 = object.getClass();
		object1 = object;
	}

	/**
	 * 獲取初始化 全部的屬性值 需要設置初始化 initialBean(Object object);
	 */
	@SuppressWarnings("finally")
	public static Field[] getClassFields() {
		fields = class1.getDeclaredFields();

		if (WhetherToEmpty.ObjectWhetherToEmpty(map)) {
			map = new HashMap<String, Object>();
		} else {
			map.clear();
		}
		if (WhetherToEmpty.ObjectWhetherToEmpty(mapOrder)) {
			mapOrder = new HashMap<String, Integer>();
		} else {
			mapOrder.clear();
		}
		try {
			int i = 0;
			for (Field field : fields) {
				field.setAccessible(true);
				mapOrder.put(field.getName(), i);
				i++;
				if ("serialVersionUID".equals(field.getName())) {
					continue;
				}
				map.put(field.getName(), field.get(object1));
			}
		} catch (Exception e) {
			Log4j.Log4JOutError(":錯誤取值 沒有設置反射的實體類 ");
		} finally {
			return fields;
		}
	}

	/**
	 * 根據屬性的名字 獲取初始化屬性的值 需要設置初始化 initialBean(Class<?> class1);
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getClassFieldValue(String FieldName) {
		Object object1 = map.get(FieldName);
		return (T) object1;
	}

	/**
	 * 创建一个新的实例 BeanParadigmUtils.
	 * 
	 */
	private BeanParadigmUtils() {
		Log4j.setLog4j(BeanParadigmUtils.class);
	}

	@SuppressWarnings("unused")
	private static BeanParadigmUtils getBeanParadigmUtils() {
		if (WhetherToEmpty.ObjectWhetherToEmpty(beanParadigmUtils)) {
			beanParadigmUtils = new BeanParadigmUtils();
		}
		return beanParadigmUtils;
	}

}
